package com.ship.common.core.utils;

import org.springframework.util.StringUtils;

public class StringUtil {

    public static final String SEPERATOR = "~~!@#~~";

    public static String firstLetterUpCase(String string) {
        String ss = null;
        try {
            ss = string.substring(0, 1).toUpperCase() + string.substring(1);
        }catch (Exception e){
        }
        return ss;
    }

    public static String firstLetterLowCase(String string) {
        return string.substring(0, 1).toLowerCase() + string.substring(1);
    }

    /**
     * 驼峰命名转下划线连接
     *
     * @param string string
     * @return string
     */
    public static String humpToUnderline(String string) {
        StringBuilder result = new StringBuilder();
        if (string != null && string.length() > 0) {
            // 循环处理其余字符
            for (int i = 0; i < string.length(); i++) {
                String s = string.substring(i, i + 1);
                // 在⼤写字母前添加下划线
                if (s.equals(s.toUpperCase()) && !Character.isDigit(s.charAt(0))) {
                    result.append("_");
                }
                // 其他字符直接转成⼤写
                result.append(s.toLowerCase());
            }
        }
        return result.toString();
    }

    public static String filterDoubleQuotation(String string) {
        if (StringUtils.isEmpty(string)) {
            throw new IllegalArgumentException("String can not be null");
        }
        return string.replaceAll("\"", "");
    }

    public static boolean isEmpty(String s) {
        return s == null || s.equals("");
    }

    public static String getIdByPlaceholder(Long id) {
        if (id == null) {
            id = 0L;
        }
        String idstr = id + "";
        return "0000000000".substring(idstr.length()) + idstr;
    }

    public static String abbreviate(String str, int length) {
        if (str == null || str.length() == 0 || length == 0) {
            return "";
        }
        if (str.length() > length) {
            return str.substring(0, length - 1) + "...";
        } else {
            return str;
        }
    }

    public static String cnToUnicode(String cn) {
        if (cn == null) {
            return null;
        }
        char[] chars = cn.toCharArray();
        String returnStr = "";
        for (int i = 0; i < chars.length; i++) {
            returnStr += Integer.toString(chars[i], 16) + " ";
        }
        return returnStr;
    }

    public static String areaCode(String areaCode) {
        if (null == areaCode) {
            return areaCode;
        }

        String code = null;
        code = areaCode.replaceFirst("0+?$", "");
        return code;
    }

    public static int indexOf(String[] array, String str) {
        if (array == null || array.length == 0) {
            return -1;
        }
        for (int i = 0; i < array.length; i++) {
            if (array[i].equals(str)) {
                return i;
            }
        }
        return -1;
    }

    public static float getSimilarityRatio(String str, String target) {

        int d[][]; // 矩阵
        int n = str.length();
        int m = target.length();
        int i; // 遍历str的
        int j; // 遍历target的
        char ch1; // str的
        char ch2; // target的
        int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1
        if (n == 0 || m == 0) {
            return 0;
        }
        d = new int[n + 1][m + 1];
        for (i = 0; i <= n; i++) { // 初始化第一列
            d[i][0] = i;
        }

        for (j = 0; j <= m; j++) { // 初始化第一行
            d[0][j] = j;
        }

        for (i = 1; i <= n; i++) { // 遍历str
            ch1 = str.charAt(i - 1);
            // 去匹配target
            for (j = 1; j <= m; j++) {
                ch2 = target.charAt(j - 1);
                if (ch1 == ch2 || ch1 == ch2 + 32 || ch1 + 32 == ch2) {
                    temp = 0;
                } else {
                    temp = 1;
                }
                // 左边+1,上边+1, 左上角+temp取最小
                d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + temp);
            }
        }

        return (1 - (float) d[n][m] / Math.max(str.length(), target.length())) * 100F;
    }
}
